package cn.itcast.web.controller.cargo;

import cn.itcast.domain.cargo.Contract;
import cn.itcast.domain.cargo.ContractExample;
import cn.itcast.domain.system.User;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.ContractService;
import cn.itcast.vo.ContractProductVo;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.DownloadUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.List;

/**
 * @author LT
 * @version 1.0.0
 * @ClassName ContractController.java
 * @Description TODO
 * @createTime 2020年03月31日 23:51:00
 */
@Controller
@RequestMapping("/cargo/contract")
public class ContractController extends BaseController {

    @Reference
    private ContractService contractService;

    @Reference
    private ContractProductService contractProductService;

    private DownloadUtil downloadUtil = new DownloadUtil();

    /**
     * 作用： 展示购销合同的列表
     * url: http://locallhost:8080/cargo/contract/list.do
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    @RequestMapping("/list.do")
    public String list(@RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "10") int pageSize) {
        // 添加查询的条件
        ContractExample contractExample = new ContractExample();
        //按照添加的时间排序
        contractExample.setOrderByClause("create_time desc");
        ContractExample.Criteria criteria = contractExample.createCriteria();

        //添加展示购销合同的条件
        //获取当前登陆者的用户等级
        User loginUser = getLoginUser();
        Integer degree = loginUser.getDegree();
        if (degree == 4) {
            //普通员工  只能看到自己
            criteria.andCreateByEqualTo(loginUser.getId());

        } else if (degree == 3) {
            //部门经理   可以看到该部门的合同
            criteria.andCreateDeptEqualTo(loginUser.getDeptId());

        } else if (degree == 2) {
            //大区经理
            PageInfo<Contract> pageInfo = contractService.findPageByDeptId(loginUser.getDeptId(), pageNum, pageSize);
            //存储到域中
            request.setAttribute("pageInfo", pageInfo);
            //返回展示页面列表的页面   前缀： /WEB-INF/pages/  后缀名： .jsp
            return "cargo/contract/contract-list";

        } else if (degree == 1) {
            //系统管理员   可以看到整个公司的
            criteria.andCompanyIdEqualTo(loginUser.getCompanyId());
        }

        PageInfo<Contract> pageInfo = contractService.findByPage(contractExample, pageNum, pageSize);
        //存储到域中
        request.setAttribute("pageInfo", pageInfo);
        //返回展示页面列表的页面   前缀： /WEB-INF/pages/  后缀名： .jsp
        return "cargo/contract/contract-list";
    }


    /*
    作用: 进入购销合同添加页面 contract-add

     */
    @RequestMapping("toAdd")
    public String toAdd() {
        return "cargo/contract/contract-add";
    }


    /*
    作用: 保存添加购销合同
    url ： cargo/contract/edit.do
    参数： Contract对象
    返回： 返回购销合同的列表页面
    注意： 整合提醒保存与更新都是使用了edit这个方法。
     */
    @RequestMapping("edit")
    public String edit(Contract contract) {
        //由于后期需要使用到某些数据，所以我们需要补全数据
        //购销合同的所属公司的id
        contract.setCompanyId(getLoginCompanyId());
        //购销合同的所属公司的名字
        contract.setCompanyName(getLoginCompanyName());
        //购销合同创建人
        contract.setCreateBy(getLoginUser().getId());
        //购销合同创建人所属的部门
        contract.setCreateDept(getLoginUser().getDeptId());
        if (StringUtils.isEmpty(contract.getId())) {
            //保存
            contractService.save(contract);
        } else {
            //更新
            contractService.update(contract);
        }
        //返回值一旦添加redirect或者是forward，那么则没有经过视图解析器。
        //
        return "redirect:/cargo/contract/list.do";

//        return "contract/list.do"; // /WEB-INF/pages/contract/list.do.jsp
    }


    /*
      作用: 进入修改购销合同页面
      url ： /contract/toUpdate.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41
      参数： id 购销合同的id
      返回： 去到修改页面的页面contract-update.jsp
   */
    @RequestMapping("toUpdate")
    public String toUpdate(String id) {
        //1. 根据购销合同的id查找对应购销合同对象
        Contract contract = contractService.findById(id);
        //2. 把购销合同对象存储到域中
        request.setAttribute("contract", contract);
        //3. 返回到更新页面
        return "cargo/contract/contract-update";
    }


    /*
   作用: 根据id删除购销合同
   url ： //contract/delete.do?id=ebf6c9a2-8c2d-482b-a509-d67c43cadb41
   参数： id 购销合同的id
   返回： 返回购销合同的列表页面
*/
    @RequestMapping("delete")
    public String delete(String id) {
        contractService.delete(id);
        return "redirect:/cargo/contract/list.do";
    }

    /*
     作用: 根据id查看购销合同
     url ： /contract/toView.do?id=dbb1e341-4c5b-4b50-8c92-271c6c505b5b
     参数： id 购销合同的id
     返回： contract-view
*/
    @RequestMapping("toView")
    public String toView(String id) {
        Contract contract = contractService.findById(id);
        request.setAttribute("contract", contract);
        return "cargo/contract/contract-view";
    }

    /*
     作用: 提交购销合同
     url ： /contract/submit.do?id=dbb1e341-4c5b-4b50-8c92-271c6c505b5b
     参数： id 购销合同的id
     返回： 购销合同的列表页面
*/
    @RequestMapping("submit")
    public String submit(String id) {
        Contract contract = contractService.findById(id);
        contract.setState(1);
        contractService.update(contract);
        return "redirect:/cargo/contract/list.do";
    }


    /*
   作用: 取消购销合同
   url ： /contract/cancel.do?id=dbb1e341-4c5b-4b50-8c92-271c6c505b5b
   参数： id 购销合同的id
   返回： 购销合同的列表页面
*/
    @RequestMapping("cancel")
    public String cancel(String id) {
        Contract contract = contractService.findById(id);
        contract.setState(0);
        contractService.update(contract);
        return "redirect:/cargo/contract/list.do";
    }

    /**
     * 进入导出出货表页面
     * url ： /cargo/contract/print.do
     *
     * @return
     */
    @RequestMapping("print")
    public String print() {
        return "cargo/print/contract-print";
    }

    @RequestMapping("printExcel")
    @ResponseBody //写出json需要添加， 下载文件的时候也需要添加。
    public void printExcel(String inputDate) throws IOException {
        //1. 创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建工作单
        Sheet sheet = workbook.createSheet("出货表");
        //3. 合并单元格
        /*int firstRow  合并的开始行
          int lastRow   合并的结束行
          int firstCol  合并的开始列
           int lastCol  合并的结束列
         */
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 1, 8));

        //4. 设置列宽
        /*
         参数1： 列的索引值
         参数2： 宽度
         */
        sheet.setColumnWidth(1, 26 * 256);
        sheet.setColumnWidth(2, 14 * 256);
        sheet.setColumnWidth(3, 26 * 256);
        sheet.setColumnWidth(4, 14 * 256);
        sheet.setColumnWidth(5, 14 * 256);
        sheet.setColumnWidth(6, 14 * 256);
        sheet.setColumnWidth(7, 14 * 256);
        sheet.setColumnWidth(8, 14 * 256);

        //操作第0行
        Row row = sheet.createRow(0);
        //获取第0行的第一个单元格
        Cell cell = row.createCell(1);
        //准备标题内容   inputDate = 2019-03 2019-12
        String title = inputDate.replace("-0", "年").replace("-", "年") + "月份出货表";
        //给单元格设置标题内容
        cell.setCellValue(title);
        //标题的样式 ，老师我现在直接使用你的表格的样式，我自己不会写。不用怕，后天我们学习模板导出,一个样式都不需要写
        cell.setCellStyle(bigTitle(workbook));


        //操作表头， 索引值为1的这行
        row = sheet.createRow(1);
        String[] titles = {"客户", "订单号", "货号", "数量", "工厂", "工厂交期", "船期", "贸易条款"};
        for (int i = 0; i < titles.length; i++) {
            //创建单元格
            cell = row.createCell(i + 1);
            cell.setCellValue(titles[i]);
            //设置样式
            cell.setCellStyle(title(workbook));
        }
        //excel的数据内容
        //如果单元格数据是日期类型，那么我们在设置内容之前必须要先格式化
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        //根据船期查询对应的货物的数据
        List<ContractProductVo> contractProductVoList = contractProductService.findByShipTime(getLoginCompanyId(), inputDate);
        //定义一个变量保存开始的行数
        int index = 2;
        //遍历所有的货物数据
        for (ContractProductVo contractProductVo : contractProductVoList) {
            //创建行
            row = sheet.createRow(index++);

            //客户
            cell = row.createCell(1);
            if (contractProductVo.getCustomName() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getCustomName());
                //设置样式
                cell.setCellStyle(text(workbook));
            }


            //客户
            cell = row.createCell(2);
            if (contractProductVo.getContractNo() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getContractNo());
                //设置样式
                cell.setCellStyle(text(workbook));
            }

            //货物
            cell = row.createCell(3);
            if (contractProductVo.getProductNo() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getProductNo());
                //设置样式
                cell.setCellStyle(text(workbook));
            }

            //数量
            cell = row.createCell(4);
            if (contractProductVo.getCnumber() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getCnumber());
                //设置样式
                cell.setCellStyle(text(workbook));
            }

            //工厂
            cell = row.createCell(5);
            if (contractProductVo.getFactoryName() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getFactoryName());
                //设置样式
                cell.setCellStyle(text(workbook));
            }

            //交货日期
            cell = row.createCell(6);
            if (contractProductVo.getDeliveryPeriod() != null) {
                //设置内容
                cell.setCellValue(simpleDateFormat.format(contractProductVo.getDeliveryPeriod()));
                //设置样式
                cell.setCellStyle(text(workbook));
            }

            //船期
            cell = row.createCell(7);
            if (contractProductVo.getShipTime() != null) {
                //设置内容
                cell.setCellValue(simpleDateFormat.format(contractProductVo.getShipTime()));
                //设置样式
                cell.setCellStyle(text(workbook));
            }


            //贸易条款
            cell = row.createCell(8);
            if (contractProductVo.getTradeTerms() != null) {
                //设置内容
                cell.setCellValue(contractProductVo.getTradeTerms());
                //设置样式
                cell.setCellStyle(text(workbook));
            }

        }
        //遍历所有的货物数据


        //如果需要通知浏览器处理数据以附件的形式下载，我们需要设置响应头
        /*response.setHeader("content-disposition","attachement;filename=出货表.xlsx");
        workbook.write(response.getOutputStream());*/

        /*
        ByteArrayOutputStream byteArrayOutputStream,   要下载的内容先保存到该字节输出流中
         HttpServletResponse response,   输出流，会把字节数组的内容输出到你指定输出流中
         String returnName
         */
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //这个类的本质就是一个字节数组
        workbook.write(outputStream);  // 把excel表格内容写入到该流中，其实本质上就是写入到一个数组中

        downloadUtil.download(outputStream, response, "出货表.xlsx");

    }


    // 大标题的样式
    public CellStyle bigTitle(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 16);
        font.setBold(true);//字体加粗
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);                //横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        return style;
    }

    //小标题的样式
    public CellStyle title(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short) 12);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);                //横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        style.setBorderTop(BorderStyle.THIN);                        //上细线
        style.setBorderBottom(BorderStyle.THIN);                    //下细线
        style.setBorderLeft(BorderStyle.THIN);                        //左细线
        style.setBorderRight(BorderStyle.THIN);                        //右细线
        return style;
    }

    //文字样式
    public CellStyle text(Workbook wb) {
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("Times New Roman");
        font.setFontHeightInPoints((short) 10);

        style.setFont(font);

        style.setAlignment(HorizontalAlignment.LEFT);                //横向居左
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        style.setBorderTop(BorderStyle.THIN);                        //上细线
        style.setBorderBottom(BorderStyle.THIN);                    //下细线
        style.setBorderLeft(BorderStyle.THIN);                        //左细线
        style.setBorderRight(BorderStyle.THIN);                        //右细线

        return style;
    }

    /**
     * excel套入模板
     *
     * @param inputDate
     * @throws IOException
     */
    // @RequestMapping("printExcel")
    // @ResponseBody //写出json需要添加， 下载文件的时候也需要添加。
    // public void printExcel(String inputDate) throws IOException {
    //     //1. 读取模板输入流 (如果读取webapp下面的内容，我们是使用ServletContext， 如果是读取resources目录的内容我们使用类路径)
    //     InputStream inputStream = session.getServletContext().getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xlsx");
    //
    //     //1.1 创建一个工作簿
    //     Workbook workbook = new XSSFWorkbook(inputStream);
    //     //2.创建工作单
    //     // Sheet sheet = workbook.createSheet("出货表");
    //     Sheet sheet = workbook.getSheetAt(0);
    //
    //     //3. 合并单元格
    //     // int firstRow  合并的开始行
    //     // int lastRow   合并的结束行
    //     // int firstCol  合并的开始列
    //     // int lastCol   合并的结束列
    //     // sheet.addMergedRegion(new CellRangeAddress(0, 0, 1, 8));
    //
    //     //4. 设置列宽
    //     /*
    //      参数1： 列的索引值
    //      参数2： 宽度
    //      */
    //     // sheet.setColumnWidth(1, 26 * 256);
    //     // sheet.setColumnWidth(2, 14 * 256);
    //     // sheet.setColumnWidth(3, 26 * 256);
    //     // sheet.setColumnWidth(4, 14 * 256);
    //     // sheet.setColumnWidth(5, 14 * 256);
    //     // sheet.setColumnWidth(6, 14 * 256);
    //     // sheet.setColumnWidth(7, 14 * 256);
    //     // sheet.setColumnWidth(8, 14 * 256);
    //
    //     //操作第0行
    //     Row row = sheet.getRow(0);
    //     //获取第0行的第一个单元格
    //     Cell cell = row.getCell(1);
    //     //准备标题内容   inputDate = 2019-03 2019-12
    //     String title = inputDate.replace("-0", "年").replace("-", "年") + "月份出货表";
    //     //给单元格设置标题内容
    //     cell.setCellValue(title);
    //     //标题的样式
    //     // cell.setCellStyle(bigTitle(workbook));
    //
    //     //操作表头， 索引值为1的这行
    //     // row = sheet.createRow(1);
    //     // String[] titles = {"客户", "订单号", "货号", "数量", "工厂", "工厂交期", "船期", "贸易条款"};
    //     // for (int i = 0; i < titles.length; i++) {
    //     //     //创建单元格
    //     //     cell = row.createCell(i + 1);
    //     //     cell.setCellValue(titles[i]);
    //     //     //设置样式
    //     //     cell.setCellStyle(title(workbook));
    //     // }
    //
    //     // 提取索引值为2的行样式出来，给下面的所有数据去使用
    //     CellStyle[] cellStyles = new CellStyle[8];
    //     row = sheet.getRow(2);
    //     // 把第二行的样式全部存储到数组中
    //     for (int i = 0; i < cellStyles.length; i++) {
    //         cell = row.getCell(i + 1);
    //         cellStyles[i] = cell.getCellStyle();
    //     }
    //
    //     //excel的数据内容
    //     //如果单元格数据是日期类型，那么我们在设置内容之前必须要先格式化
    //     SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    //
    //     //根据船期查询对应的货物的数据
    //     List<ContractProductVo> contractProductVoList = contractProductService.findByShipTime(getLoginCompanyId(), inputDate);
    //     //定义一个变量保存开始的行数
    //     int index = 2;
    //     //遍历所有的货物数据
    //     for (ContractProductVo contractProductVo : contractProductVoList) {
    //         //创建行
    //         row = sheet.createRow(index++);
    //
    //         //客户
    //         cell = row.createCell(1);
    //         if (contractProductVo.getCustomName() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getCustomName());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[0]);
    //         }
    //
    //
    //         //客户
    //         cell = row.createCell(2);
    //         if (contractProductVo.getContractNo() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getContractNo());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[1]);
    //         }
    //
    //         //货物
    //         cell = row.createCell(3);
    //         if (contractProductVo.getProductNo() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getProductNo());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[2]);
    //         }
    //
    //         //数量
    //         cell = row.createCell(4);
    //         if (contractProductVo.getCnumber() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getCnumber());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[3]);
    //         }
    //
    //         //工厂
    //         cell = row.createCell(5);
    //         if (contractProductVo.getFactoryName() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getFactoryName());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[4]);
    //         }
    //
    //         //交货日期
    //         cell = row.createCell(6);
    //         if (contractProductVo.getDeliveryPeriod() != null) {
    //             //设置内容
    //             cell.setCellValue(simpleDateFormat.format(contractProductVo.getDeliveryPeriod()));
    //             //设置样式
    //             cell.setCellStyle(cellStyles[5]);
    //         }
    //
    //         //船期
    //         cell = row.createCell(7);
    //         if (contractProductVo.getShipTime() != null) {
    //             //设置内容
    //             cell.setCellValue(simpleDateFormat.format(contractProductVo.getShipTime()));
    //             //设置样式
    //             cell.setCellStyle(cellStyles[6]);
    //         }
    //
    //
    //         //贸易条款
    //         cell = row.createCell(8);
    //         if (contractProductVo.getTradeTerms() != null) {
    //             //设置内容
    //             cell.setCellValue(contractProductVo.getTradeTerms());
    //             //设置样式
    //             cell.setCellStyle(cellStyles[7]);
    //         }
    //
    //     }
    //
    //     //如果需要通知浏览器处理数据以附件的形式下载，我们需要设置响应头
    //     /*response.setHeader("content-disposition","attachement;filename=出货表.xlsx");
    //     workbook.write(response.getOutputStream());*/
    //
    //     /*
    //     ByteArrayOutputStream byteArrayOutputStream,   要下载的内容先保存到该字节输出流中
    //      HttpServletResponse response,   输出流，会把字节数组的内容输出到你指定输出流中
    //      String returnName
    //      */
    //     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); //这个类的本质就是一个字节数组
    //     workbook.write(outputStream);  // 把excel表格内容写入到该流中，其实本质上就是写入到一个数组中
    //
    //     downloadUtil.download(outputStream, response, "出货表.xlsx");
    //
    // }
}